package ga;
import java.util.Stack;

public class Atributo<Valor> {
	  
	
	private Stack<Atributo> dep;
	private String desc;
	private boolean hecho;
	
	private ExpSem<Valor> expSem;
	private Valor val;
	
	public Atributo()  {
		dep = new Stack<Atributo>();
		hecho = false;
		desc = "<no disponible>";
// DUDA descripcion = "<descripcion de atributo no disponible>";
    } 
       
    public void calcula() {
    	this.val = expSem.val();
    	hecho = true;
    }
    public Valor val() {
    	if (! hecho())
    		calcula();  	 
    return val;  
    
    } 
    public Atributo nextDep() {
    	Atributo sig;
    	while (! dep.isEmpty()) {
    		sig = dep.pop();
    		if (!sig.hecho()) return sig;
    	}
    	return null; 
    } 
    public void insertDep(Atributo ... as) {
    	for(Atributo a: as) dep.push(a);  
    }
    
    //mutadoras
    public void fijaExpresion(ExpSem<Valor> expAux) {
    	this.expSem = expAux;  
    }
    public void fijaDescripcion(String descAux) {
    	this.desc = descAux;  
    }
    //accesoras
    public boolean hecho() {
    	return hecho; 
    }
    public String descripcion() {
    	return desc;  
    }
}
